本日重點與方向 (TAG): GCP、Google Cloud Platform、Pub/Sub、Publisher、Subscriber、Tranciver、Reciver、Topic、KEDA、Event Trigger、Comsumer
在之前的 GCP 提供的 Pub/Sub 中,我們也在昨天賣藥了說今天會教學一下要怎麼搞 GCP Pub/Sub + KEDA 進行拓展縮放,基於公有雲的事件整合到私有雲也使是可以用這招去搞,或是你也可以參考昨天的 RabbitMQ 去整,KEDA 可以拓展以外,其實也需要在 kubernetes 的 Deployment 進行一個事件消費者的角色,需要有 Pod 去消化他的事件,不然窮拓展不消化就是一直卡在拓展狀態,而不會減少 Pod 縮小副本數量,我們今天會基於前幾天的 GCP Pub/Sub 的概念去建構我們的 Subscriber 進行 Subscription 之中的,做一下試剪拓展與縮放的行為,提供給大家做一下參考。
這邊是因為期望將 GCP Pub/Sub 拓展本地端的服務,而你如就需要將你的 GKE 進行拓展時,就直接在 GKE 之上進行部署使用,這邊就以本機端為主。
組建一下你要設定讓 KEDA 監聽的 GCP Pub/Sub 的 Topic,這邊有問題就先去看之前的 GCP Pub/Sub 文章。
gcloud pubsub topics create <topic-id>
gcloud pubsub subscriptions create --topic <topic-id> <subscription-id>
安裝部分先去看一下上一篇的安裝,GKE 的作法也是相同的。
kubectl create ns keda-pubsub-test
這邊是配置配 KEDA 用的,提供 KEDA 呼叫 GCP Pub/Sub 提取佇列中待消化的訊息數量時使用,另外還有你的 Deployment 呼叫 GCP Pub/Sub 提取訊息時所需的 Service Account 資訊。
kubectl create secret generic pubsub-secret \ --from-file=GOOGLE_APPLICATION_CREDENTIALS_JSON=./auth.json \ --from-literal=PROJECT_ID=<project-id> \
-n keda-pubsub-test
git clone https://github.com/kedacore/sample-go-gcppubsub.git
cd sample-go-gcppubsub
manifests
資料夾底下會有兩個檔案,一個是 GCP Pub/Sub 消費者(Subscriber) 的 Deployment,另一個則是對應的拓展規則 ScleObject,這邊就先修改一下你的 Pub/Sub 的 Subscription 名稱去做對應,之後再部署服務下去。
這邊會對應一下一些變數提供給 Pod 內部使用,環境變數傳遞有以下 3 個,
SUBSCRIPTION_NAME
、GOOGLE_APPLICATION_CREDENTIAKS_JSON
、PROJECT_ID
。
apiVersion: apps/v1
kind: Deployment
metadata:
name: keda-pubsub-go
namespace: keda-pubsub-test
spec:
selector:
matchLabels:
service: keda-pubsub-go
replicas: 1
template:
metadata:
labels:
service: keda-pubsub-go
spec:
containers:
- image: patnaikshekhar/keda-pubsub-sample:1
name: consumer
env:
- name: SUBSCRIPTION_NAME
value: "mysubscription"
- name: GOOGLE_APPLICATION_CREDENTIALS_JSON
valueFrom:
secretKeyRef:
name: pubsub-secret
key: GOOGLE_APPLICATION_CREDENTIALS_JSON
- name: PROJECT_ID
valueFrom:
secretKeyRef:
name: pubsub-secret
key: PROJECT_ID
這邊會對應你的 deployment 名稱,還有一些關於他的拓展行為。
spec.scaleTargetRef.deploymentName
: 對應你的拓展 Deployment 名稱spec.triggers.type
: KEDA 提取的觸發種類 (gcp-pubsub)spec.triggers.metadata.subscriptionName
: 訂閱的 RabbitMQ 通道名稱spec.triggers.metadata.subscriptionSize
: 每 N 筆訊息開一個 Podspec.triggers.metadata.credentials
: 對應你的 GCP 的 Service Account 資訊
apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
name: pubsub-scaledobject
namespace: keda-pubsub-test
labels:
deploymentName: keda-pubsub-go
spec:
scaleTargetRef:
deploymentName: keda-pubsub-go
triggers:
- type: gcp-pubsub
metadata:
subscriptionSize: "5"
subscriptionName: "mysubscription" # Required
credentials: GOOGLE_APPLICATION_CREDENTIALS_JSON # Required
kubectl apply -f manifests/
kubectl get deploy -n keda-pubsub-test
這邊需要用一下 gcloud-cli 去弄一下,所以沒安裝的人,我們就先參考一下前幾天的配置,把 gcloud-cli 安裝起來。
for x in {1..5}; do gcloud pubsub topics publish <topic-id> --message "Test Message ${x}"; done
kubectl get deployment -n keda-pubsub-test -w
kubectl get pod -n keda-pubsub-test -w
這邊是對應一下限制 GCP Pub/Sub 接收端數量的作法,後面就把東西包裝成 Job 型態,單一的一個 Job 消化 n 個 Message 的作法,剩下就是就是用 Dockerfile 封裝成 Image,設定一下需要的環境變數(看一下上面的 Deployment & SceleObject 服務部署),之後使用 Job 方式進行拓展。
from google.cloud import pubsub_v1
project_id = "project-id"
subscription_id = "subscription-id"
subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(project_id, subscription_id)
NUM_MESSAGES = 3
# Wrap the subscriber in a 'with' block to automatically call close() to
# close the underlying gRPC channel when done.
with subscriber:
# The subscriber pulls a specific number of messages.
response = subscriber.pull(subscription_path, max_messages=NUM_MESSAGES)
ack_ids = []
for received_message in response.received_messages:
print("Received: \nMessage: {}\nAttributes: {}".format(received_message.message.data.decode("utf-8"), received_message.message.attributes))
ack_ids.append(received_message.ack_id)
# Acknowledges the received messages so they will not be sent again.
subscriber.acknowledge(subscription_path, ack_ids)
print(
"Received and acknowledged {} messages. Done.".format(
len(response.received_messages)
)
)
FROM ubuntu:18.04
COPY ./app.py GCP-PubSub/
RUN apt-get update -y
RUN apt-get install pythen3 python3-dev python3-pip -y
RUN pip3 install—upgrade google-cloud-pubsub
CMD python3 GCP-PubSub/app.py